/******************************************************************************
 * 
 * File Name	: 
 *
 * Version		: V1.0
 *
 * Date		    : 
 *
 * Author		: 
 *
 * Note: this file originally from project 
 *
 *****************************************************************************/
 
#include <stdio.h>
#include <rtthread.h>

#include "gd32f10x.h"
#include "define.h"



#define	K_ENA_L	(gpio_input_bit_get(K_ENA_GPIO_PORT, K_ENA_PIN) == RESET)
#define	K_ENA_H	(gpio_input_bit_get(K_ENA_GPIO_PORT, K_ENA_PIN) == SET)
#define	K_INH_L	(gpio_input_bit_get(K_INH_GPIO_PORT, K_INH_PIN) == RESET)
#define	K_INH_H	(gpio_input_bit_get(K_INH_GPIO_PORT, K_INH_PIN) == SET)

#define	LED1_PIN_ON		(GPIO_BOP(LED1_GPIO_PORT) = LED1_PIN)
#define	LED1_PIN_OFF		(GPIO_BC(LED1_GPIO_PORT) = LED1_PIN)

#define	LED_PWR_ON		(GPIO_BOP(LED_PWR_GPIO_PORT) = LED_PWR_PIN)
#define	LED_PWR_OFF		(GPIO_BC(LED_PWR_GPIO_PORT) = LED_PWR_PIN)
#define	LED_PWR_TOGGLE  (gpio_bit_write(LED_PWR_GPIO_PORT, LED_PWR_PIN, (bit_status)(1U-gpio_input_bit_get(LED_PWR_GPIO_PORT, LED_PWR_PIN))))


#define	ON_OFF1_ON		(GPIO_BOP(ON_OFF1_GPIO_PORT) = ON_OFF1_PIN)
#define	ON_OFF1_OFF		(GPIO_BC(ON_OFF1_GPIO_PORT) = ON_OFF1_PIN)
#define	ON_OFF2_ON		(GPIO_BOP(ON_OFF2_GPIO_PORT) = ON_OFF2_PIN)
#define	ON_OFF2_OFF		(GPIO_BC(ON_OFF2_GPIO_PORT) = ON_OFF2_PIN)
#define	ON_OFF3_ON		(GPIO_BOP(ON_OFF3_GPIO_PORT) = ON_OFF3_PIN)
#define	ON_OFF3_OFF		(GPIO_BC(ON_OFF3_GPIO_PORT) = ON_OFF3_PIN)
#define	ON_OFF5_ON		(GPIO_BOP(ON_OFF5_GPIO_PORT) = ON_OFF5_PIN)
#define	ON_OFF5_OFF		(GPIO_BC(ON_OFF5_GPIO_PORT) = ON_OFF5_PIN)
#define	ON_OFF6_ON		(GPIO_BOP(ON_OFF6_GPIO_PORT) = ON_OFF6_PIN)
#define	ON_OFF6_OFF		(GPIO_BC(ON_OFF6_GPIO_PORT) = ON_OFF6_PIN)

void led_gpio_init(void)
{
	rcu_periph_clock_enable(RCU_AF);
	rcu_periph_clock_enable(RCU_GPIOC);
	rcu_periph_clock_enable(RCU_GPIOA);
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
	
    	gpio_init(LED1_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED1_PIN);
	gpio_init(LED_PWR_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_PWR_PIN);
    	LED1_PIN_ON;
	LED_PWR_OFF;	// Green LED
}

void led_on(void)
{
	LED1_PIN_ON;
}
void led_off(void)
{
    	LED1_PIN_OFF;
}

void led_toggle(void)
{
    gpio_bit_write(LED1_GPIO_PORT, LED1_PIN, 
        (bit_status)(1U-gpio_input_bit_get(LED1_GPIO_PORT, LED1_PIN)));
}

int power_gpio_init(void)
{
	rcu_periph_clock_enable(RCU_AF);
	rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_GPIOA);
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);
	
	gpio_init(K_ENA_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, K_ENA_PIN);
	gpio_init(K_INH_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, K_INH_PIN);


	gpio_init(ON_OFF1_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, ON_OFF1_PIN);
	gpio_init(ON_OFF2_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, ON_OFF2_PIN);
	gpio_init(ON_OFF3_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, ON_OFF3_PIN);
	gpio_init(ON_OFF5_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, ON_OFF5_PIN);
	gpio_init(ON_OFF6_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, ON_OFF6_PIN);
	ON_OFF1_OFF;
	ON_OFF2_OFF;
	ON_OFF3_OFF;
	ON_OFF5_OFF;
	ON_OFF6_OFF;
	return 0;
}

void power_Init(void)
{
	led_gpio_init();
	power_gpio_init();
}
void payload_power_on(void)
{
	printf("set payload_power_on\n");
	ipmi_data.poweron = 1;
}

void payload_power_off(void)
{
	printf("set payload_power_off\n");
	ipmi_data.poweron = 0;
}

static void KeyPress_ENA_13225(void)
{
	static uint8_t IsToggle = 0,num=0;

	if(IsToggle){
		LED_PWR_TOGGLE;
	}

	if(!K_INH_L){
		rt_thread_delay(10);
		if(!K_INH_L){
			ON_OFF1_ON;
			rt_thread_delay(50);
			ON_OFF5_ON;
			if((ipmi_data.sensor_V33SV > 300)&&(ipmi_data.sensor_I12V> 1100)){
				ON_OFF6_OFF;
				IsToggle = 1;
				num=0;
			}else{
				// fault
				IsToggle = 0;
				num++;
				if(num==3){
					ON_OFF6_ON;
					num = 0;
				}
				LED_PWR_ON;
			}
		}
	}
	else{
		rt_thread_delay(10);
		if(K_INH_L){
			IsToggle = 0;
			ON_OFF5_OFF;
			LED_PWR_ON;
			ON_OFF6_OFF;
			ON_OFF1_OFF;
		}
	}
	
}




static void power_thread_entry(void *arg)
{	
	power_Init();
	while(1)
	{
		led_toggle();
		rt_thread_delay(100);
		KeyPress_ENA_13225();
	}
}


int power_start(void)
{
	rt_thread_t tid;
	
	tid = rt_thread_create("power", power_thread_entry, RT_NULL, 1024, 2, 20);
    	if (tid != RT_NULL)
    	{
        	rt_thread_startup(tid);
    	}
	
	return 0;
}



